/**
 * 通用表单字段校验工具
 * 支持：必填校验、函数动态校验、批量校验
 */
export class FormValidator {
	/**
	 * 校验单个字段
	 * @param {Any} value - 字段值
	 * @param {String|Function} rule - 校验规则
	 *   - String: 必填提示语
	 *   - Function: (value, formData) => { valid: Boolean, msg: String }
	 * @param {Object} formData - 当前完整表单数据（用于条件判断）
	 * @returns {Boolean} 是否通过
	 */
	static validateField(value, rule, formData = {}) {
		// 1. 判断是否有值
		const hasValue = val => {
			return val !== null && val !== undefined && val !== '';
		};

		// 2. 规则为字符串：表示必填
		if (typeof rule === 'string') {
			if (!hasValue(value)) {
				uni.$u.toast(rule);
				return false;
			}
			return true;
		}

		// 3. 规则为函数：执行自定义逻辑
		if (typeof rule === 'function') {
			const result = rule(value, formData);
			if (result && result.valid === false) {
				uni.$u.toast(result.msg || '校验失败');
				return false;
			}
			return true;
		}

		// 4. 无规则或规则类型错误，默认通过
		return true;
	}

	/**
	 * 批量校验多个字段
	 * @param {Array} fields - [{ value: 值, rule: 规则 }]
	 * @param {Object} formData - 当前表单数据
	 * @returns {Boolean} 是否全部通过
	 */
	static validateFields(fields, formData) {
		for (let field of fields) {
			const { value, rule } = field;
			if (!this.validateField(value, rule, formData)) {
				return false;
			}
		}
		return true;
	}
}

/**
 * 使用示例
 * 批量校验多个字段
 * const fields = [
    { value: formData.name, rule: '请输入课程名称' },
    { value: formData.artType, rule: '请选择课程分类' },
    { value: formData.introduced, rule: '请输入作品介绍' },
    { value: formData.courseType, rule: '请选择课程类型' },
    { value: formData.priceType, rule: '请选择价格类型' },
    { value: formData.cover, rule: '请上传课程封面' },

    // 动态校验：totalVideo
    {
      value: formData.totalVideo,
      rule: (value, data) => {
        if (data.courseType === '2') {
          if (!value || Number(value) <= 0) {
            return { valid: false, msg: '请输入正确的视频节数（大于0）' };
          }
        }
        return { valid: true };
      }
    },

    // 动态校验：price
    {
      value: formData.price,
      rule: (value, data) => {
        if (data.priceType === '2') {
          const num = Number(value);
          if (isNaN(num) || num < 0.01) {
            return { valid: false, msg: '请输入正确的价格（大于0）' };
          }
          if (!/^\d+(\.\d{1,2})?$/.test(value)) {
            return { valid: false, msg: '价格最多保留两位小数' };
          }
        }
        return { valid: true };
      }
    },

    // 动态校验：fileList 上传状态
    {
      value: this.fileList1,
      rule: (files, data) => {
        if (!files || files.length === 0) {
          return { valid: false, msg: '请上传课程封面' };
        }
        const allSuccess = files.every(f => f.url && f.status === 'success');
        if (!allSuccess) {
          return { valid: false, msg: '封面图片上传中，请等待完成' };
        }
        return { valid: true };
      }
    }
  ];

  // 执行批量校验
  if (!FormValidator.validateFields(fields, this.formData)) {
    return;
  }

  // 所有校验通过，提交数据
  uni.showLoading({ title: '正在提交' });
  // 下面执行提交逻辑
 */
